library(readxl)
<- read_excel("Bases/LungCapData.xls")
LungCapData attach(LungCapData)
Algoritmos para selección de variables en lm
Introducción
Para la selección de variables en la regresión lienal múltiple, existen métodos (algoritmos) que facilitan este proceso. Sin embargo, está selección no es definitiva y siempre se deberá utilizar el criterio personal y sobre todo la experiencia del investigador para identificar y validar los modelos. En este archivo en particular se revisarán los stepwise methods
La ejecución de un modelo de regresión con muchas variables, incluidas las irrelevantes, conducirá a un modelo innecesariamente complejo y erroneo. Evite dolores de cabeza. Cuando se añaden variables que no aportan información al modelo, este se vuelve complejo, se generá ruido y se hace “imposible” interpretar los resultados. Un problema más común al incluir muchas variables, especialmente si están correlacionadas (multicolinealidad), es que los coeficientes pueden volverse inestables y tener grandes varianzas. Esto puede hacer que las estimaciones de \(\beta\) sean imprecisas y difíciles de interpretar.
Recuerde que para fines prácticos el modelo con la menor cantidad de variables y que más explique será el mejor. En general, los modelos más simples que explican adecuadamente los datos tienden a ser preferidos, siempre y cuando no comprometan el poder predictivo.
Además realizar la selección de variables utilizando pureba y error en un modelo con muchas variables, puede llegar a ser laborioso. Imagine la cantidad de combinaciones posibles para un modelo en el que se prueben 10-20 variables.
La regresión escalonada (Stepwised regressions) es una forma de seleccionar variables importantes para obtener un modelo simple y fácilmente interpretable. Existe tres principales tipos de regresión escalonada
- Forward stepwise (hacia adelante)
- Backward stepwise (hacia atrás)
- Stepwise (en abmas direcciones)
Forward stepwise
Inicia con un modelo sin variables (solo el intercepto) y en cada paso hacia adelante agrega una variable explicativa significativa. La selección progresiva hacia adelante (o selección hacia adelante) es un método de selección de variables que:
- Comienza con un modelo que no contiene variables (llamado modelo nulo, en el que solo se agrega el intercepto)
- Luego comienza a agregar las variables más significativas una tras otra hasta que se alcance una regla de detención preespecificada o hasta que todas las variables consideradas se incluyan en el modelo.
De forma general estos son los pasos del algoritmo:
1.Comienzo con un modelo vacío: El modelo inicial no incluye ninguna variable predictora (solo el intercepto). 2. Evaluación de todas las variables: En cada paso, se evalúan todas las variables candidatas que aún no están en el modelo. Para cada variable, se estima el modelo con esa variable incluida. 3. Criterio de inclusión: Se selecciona la variable que más mejora el ajuste del modelo según algún criterio estadístico, como el AIC (Criterio de Información de Akaike), BIC (Criterio de Información Bayesiano) o el p-valor asociado a la significancia estadística del coeficiente de la variable. 4. Añadir la variable al modelo: La variable seleccionada se añade al modelo. Luego, se vuelve a evaluar el siguiente conjunto de variables que aún no están incluidas. 5. Repetir el proceso: Este proceso continúa hasta que no haya más variables que mejoren significativamente el modelo (según el criterio establecido) o hasta que se alcance un número predeterminado de variables.
Para estaz clase de regresión escalonada, el criterio de detención es el AIC.Los valores p son malos, recuerdelo.
Imagen tomada de:
Reglas para la selección de variables
En nuestro caso la regla para detención es el Akaike Information Criterion (AIC).
El AIC es un método matemático para evaluar qué tan bien se ajusta un modelo a los datos a partir de los cuales se generó. En otras palabras el AIC, se utiliza para comparar diferentes modelos posibles y determinar cuál se ajusta mejor a los datos. No tiene sentido fuera de la regresión. AIC se calcula a partir de:
- El número de variables independientes utilizadas para construir el modelo.
- La estimación de máxima verosimilitud del modelo (qué tan bien el modelo reproduce los datos).
El modelo de mejor ajuste según AIC es el que explica la mayor cantidad de variación utilizando la menor cantidad posible de variables independientes.
Otra forma de realizar está selección es basándose en criterios pre establecidos como el valor de \(p\) y el valor de \(R^2\). Por ejemplo, para seleccionar que variables incluir en el modelo, se toma en cuenta lo siguiente:
- La variable que tiene el valor p más pequeño
- La variable que proporciona el mayor aumento en \(R^2\)
- La variable que proporciona la mayor caída en el modelo RSS (suma de cuadrados de residuos) en comparación con otros predictores en consideración.
También puede establecerse una regla de decisión en especifico.
Recuerde que aquí utilizaremos el AIC
Backward stepwise
La selección por pasos hacia atrás (o eliminación hacia atrás) es un método de selección de variables que:
- Comienza con un modelo que contiene todas las variables consideradas (llamado modelo completo)
- Luego comienza a eliminar las variables menos significativas una tras otra.
- Hasta que se alcance una regla de detención preespecificada o hasta que no quede ninguna variable en el modelo
Stepwise
- Inicia con modelo sin variables y agrega una variable explicacativa significativa
- Es una combinación de la regresión forward y bcakward. Si en un paso encuentra un modelo sin una variable significativa la quita y repite el paso.
¿Cómo hacerlo en R
?
Para poder realizar una regresión escalonada se necesita crear un modelo vacío y un modelo con todas la variables. Esto nos servirá para indicar a R
de donde a donde comenzará a probrar modelos.
Para el siguiente ejemplo, utilizaremos la base se datos LungCapData, con estos datos construiremos un modelo para predecir que variables afectan la capacidad pulmonar.
Preparando los modelos
- Importar y adjuntar la base de datos
- Crear un modelo vacío.
<- lm(LungCap~1)# con 1 indicamos que no tiene variables predictoras
modelo.vacio summary(modelo.vacio)
Call:
lm(formula = LungCap ~ 1)
Residuals:
Min 1Q Median 3Q Max
-7.3561 -1.7131 0.1369 1.9369 6.8119
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.86315 0.09886 79.53 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.662 on 724 degrees of freedom
- Crear un modelo con todas las variables
<- lm(LungCap~., data = LungCapData)# el punto indica que todas
modelo.completo #la variables serán tomadas en cuenta. Es necesario incluir el nombre de la base
summary(modelo.completo)
Call:
lm(formula = LungCap ~ ., data = LungCapData)
Residuals:
Min 1Q Median 3Q Max
-3.3388 -0.7200 0.0444 0.7093 3.0172
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -11.32249 0.47097 -24.041 < 2e-16 ***
Age 0.16053 0.01801 8.915 < 2e-16 ***
Height 0.26411 0.01006 26.248 < 2e-16 ***
Smokeyes -0.60956 0.12598 -4.839 1.60e-06 ***
Gendermale 0.38701 0.07966 4.858 1.45e-06 ***
Caesareanyes -0.21422 0.09074 -2.361 0.0185 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared: 0.8542, Adjusted R-squared: 0.8532
F-statistic: 842.8 on 5 and 719 DF, p-value: < 2.2e-16
Construyendo un modelo forward
Para este paso utilzaremos la función step
<- step(modelo.vacio, scope = list(lower=modelo.vacio,
modelo.forward upper=modelo.completo),
direction = "forward")
Start: AIC=1420.67
LungCap ~ 1
Df Sum of Sq RSS AIC
+ Height 1 4269.0 861.5 129.05
+ Age 1 3447.0 1683.5 614.77
+ Gender 1 148.0 4982.5 1401.45
+ Smoke 1 52.7 5077.7 1415.18
<none> 5130.5 1420.67
+ Caesarean 1 2.3 5128.1 1422.34
Step: AIC=129.05
LungCap ~ Height
Df Sum of Sq RSS AIC
+ Age 1 55.913 805.57 82.396
+ Smoke 1 18.847 842.63 115.010
+ Gender 1 8.716 852.76 123.675
+ Caesarean 1 5.874 855.61 126.087
<none> 861.48 129.048
Step: AIC=82.4
LungCap ~ Height + Age
Df Sum of Sq RSS AIC
+ Smoke 1 27.6589 777.91 59.066
+ Gender 1 26.9647 778.60 59.713
+ Caesarean 1 6.2692 799.30 78.732
<none> 805.57 82.396
Step: AIC=59.07
LungCap ~ Height + Age + Smoke
Df Sum of Sq RSS AIC
+ Gender 1 24.3327 753.57 38.026
+ Caesarean 1 5.5801 772.33 55.847
<none> 777.91 59.066
Step: AIC=38.03
LungCap ~ Height + Age + Smoke + Gender
Df Sum of Sq RSS AIC
+ Caesarean 1 5.7968 747.78 34.427
<none> 753.57 38.026
Step: AIC=34.43
LungCap ~ Height + Age + Smoke + Gender + Caesarean
summary(modelo.forward)
Call:
lm(formula = LungCap ~ Height + Age + Smoke + Gender + Caesarean)
Residuals:
Min 1Q Median 3Q Max
-3.3388 -0.7200 0.0444 0.7093 3.0172
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -11.32249 0.47097 -24.041 < 2e-16 ***
Height 0.26411 0.01006 26.248 < 2e-16 ***
Age 0.16053 0.01801 8.915 < 2e-16 ***
Smokeyes -0.60956 0.12598 -4.839 1.60e-06 ***
Gendermale 0.38701 0.07966 4.858 1.45e-06 ***
Caesareanyes -0.21422 0.09074 -2.361 0.0185 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared: 0.8542, Adjusted R-squared: 0.8532
F-statistic: 842.8 on 5 and 719 DF, p-value: < 2.2e-16
$anova modelo.forward
Step Df Deviance Resid. Df Resid. Dev AIC
1 NA NA 724 5130.4725 1420.66650
2 + Height -1 4268.99282 723 861.4796 129.04782
3 + Age -1 55.91333 722 805.5663 82.39604
4 + Smoke -1 27.65895 721 777.9074 59.06594
5 + Gender -1 24.33272 720 753.5746 38.02589
6 + Caesarean -1 5.79681 719 747.7778 34.42733
Construyendo un modelo backward
Para este paso utilzaremos la función step
<- step(modelo.completo, scope = list(lower=modelo.vacio,
modelo.backward upper=modelo.completo),
direction = "backward")
Start: AIC=34.43
LungCap ~ Age + Height + Smoke + Gender + Caesarean
Df Sum of Sq RSS AIC
<none> 747.78 34.43
- Caesarean 1 5.80 753.57 38.03
- Smoke 1 24.35 772.13 55.66
- Gender 1 24.55 772.33 55.85
- Age 1 82.65 830.43 108.44
- Height 1 716.54 1464.32 519.66
summary(modelo.backward)
Call:
lm(formula = LungCap ~ Age + Height + Smoke + Gender + Caesarean,
data = LungCapData)
Residuals:
Min 1Q Median 3Q Max
-3.3388 -0.7200 0.0444 0.7093 3.0172
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -11.32249 0.47097 -24.041 < 2e-16 ***
Age 0.16053 0.01801 8.915 < 2e-16 ***
Height 0.26411 0.01006 26.248 < 2e-16 ***
Smokeyes -0.60956 0.12598 -4.839 1.60e-06 ***
Gendermale 0.38701 0.07966 4.858 1.45e-06 ***
Caesareanyes -0.21422 0.09074 -2.361 0.0185 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared: 0.8542, Adjusted R-squared: 0.8532
F-statistic: 842.8 on 5 and 719 DF, p-value: < 2.2e-16
$anova modelo.backward
Step Df Deviance Resid. Df Resid. Dev AIC
1 NA NA 719 747.7778 34.42733
Construyendo un modelo stepwise
Para este paso utilzaremos la variable step
<- step(modelo.vacio, scope = list(lower=modelo.vacio,
modelo.stepwise upper=modelo.completo),
direction = "both")
Start: AIC=1420.67
LungCap ~ 1
Df Sum of Sq RSS AIC
+ Height 1 4269.0 861.5 129.05
+ Age 1 3447.0 1683.5 614.77
+ Gender 1 148.0 4982.5 1401.45
+ Smoke 1 52.7 5077.7 1415.18
<none> 5130.5 1420.67
+ Caesarean 1 2.3 5128.1 1422.34
Step: AIC=129.05
LungCap ~ Height
Df Sum of Sq RSS AIC
+ Age 1 55.9 805.6 82.40
+ Smoke 1 18.8 842.6 115.01
+ Gender 1 8.7 852.8 123.68
+ Caesarean 1 5.9 855.6 126.09
<none> 861.5 129.05
- Height 1 4269.0 5130.5 1420.67
Step: AIC=82.4
LungCap ~ Height + Age
Df Sum of Sq RSS AIC
+ Smoke 1 27.66 777.91 59.07
+ Gender 1 26.96 778.60 59.71
+ Caesarean 1 6.27 799.30 78.73
<none> 805.57 82.40
- Age 1 55.91 861.48 129.05
- Height 1 877.91 1683.48 614.77
Step: AIC=59.07
LungCap ~ Height + Age + Smoke
Df Sum of Sq RSS AIC
+ Gender 1 24.33 753.57 38.03
+ Caesarean 1 5.58 772.33 55.85
<none> 777.91 59.07
- Smoke 1 27.66 805.57 82.40
- Age 1 64.73 842.63 115.01
- Height 1 877.91 1655.82 604.76
Step: AIC=38.03
LungCap ~ Height + Age + Smoke + Gender
Df Sum of Sq RSS AIC
+ Caesarean 1 5.80 747.78 34.43
<none> 753.57 38.03
- Gender 1 24.33 777.91 59.07
- Smoke 1 25.03 778.60 59.71
- Age 1 82.24 835.82 111.12
- Height 1 714.22 1467.79 519.37
Step: AIC=34.43
LungCap ~ Height + Age + Smoke + Gender + Caesarean
Df Sum of Sq RSS AIC
<none> 747.78 34.43
- Caesarean 1 5.80 753.57 38.03
- Smoke 1 24.35 772.13 55.66
- Gender 1 24.55 772.33 55.85
- Age 1 82.65 830.43 108.44
- Height 1 716.54 1464.32 519.66
summary(modelo.stepwise)
Call:
lm(formula = LungCap ~ Height + Age + Smoke + Gender + Caesarean)
Residuals:
Min 1Q Median 3Q Max
-3.3388 -0.7200 0.0444 0.7093 3.0172
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -11.32249 0.47097 -24.041 < 2e-16 ***
Height 0.26411 0.01006 26.248 < 2e-16 ***
Age 0.16053 0.01801 8.915 < 2e-16 ***
Smokeyes -0.60956 0.12598 -4.839 1.60e-06 ***
Gendermale 0.38701 0.07966 4.858 1.45e-06 ***
Caesareanyes -0.21422 0.09074 -2.361 0.0185 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared: 0.8542, Adjusted R-squared: 0.8532
F-statistic: 842.8 on 5 and 719 DF, p-value: < 2.2e-16
Criterio de información de Akaike (AIC)
El criterio de información de Akaike (AIC) permite juzgar la bondad del ajuste del modelo de regresión teniendo en cuenta la posibilidad de sobreajustar los datos. El AIC es una herramienta de selección de modelos que logra un equilibrio entre la bondad de ajuste, es decir, qué tan bien se ajusta un modelo a un conjunto de datos.
La puntuación AIC por sí sola no es significativa a menos que se compare con la puntuación AIC de otros modelos de regresión.
Al comparar modelos de la competencia, se prefiere una puntuación AIC más baja a una puntuación más alta. Una puntuación más baja indica que el modelo tiene una capacidad superior para equilibrar la bondad del ajuste con el riesgo de sobreajustar el conjunto de datos.
Otras funciones
library(MASS)
# Modelo completo
<- lm(LungCap ~., data = LungCapData)
full.model # Stepwise method
<- stepAIC(full.model, direction = "both",
step.model trace = FALSE)
summary(step.model)
Call:
lm(formula = LungCap ~ Age + Height + Smoke + Gender + Caesarean,
data = LungCapData)
Residuals:
Min 1Q Median 3Q Max
-3.3388 -0.7200 0.0444 0.7093 3.0172
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -11.32249 0.47097 -24.041 < 2e-16 ***
Age 0.16053 0.01801 8.915 < 2e-16 ***
Height 0.26411 0.01006 26.248 < 2e-16 ***
Smokeyes -0.60956 0.12598 -4.839 1.60e-06 ***
Gendermale 0.38701 0.07966 4.858 1.45e-06 ***
Caesareanyes -0.21422 0.09074 -2.361 0.0185 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared: 0.8542, Adjusted R-squared: 0.8532
F-statistic: 842.8 on 5 and 719 DF, p-value: < 2.2e-16
library(leaps)
<- regsubsets(LungCap~., data = LungCapData, nvmax = 5, # nvmax es el número de variables
models method = "seqrep")
summary(models)
Subset selection object
Call: regsubsets.formula(LungCap ~ ., data = LungCapData, nvmax = 5,
method = "seqrep")
5 Variables (and intercept)
Forced in Forced out
Age FALSE FALSE
Height FALSE FALSE
Smokeyes FALSE FALSE
Gendermale FALSE FALSE
Caesareanyes FALSE FALSE
1 subsets of each size up to 5
Selection Algorithm: 'sequential replacement'
Age Height Smokeyes Gendermale Caesareanyes
1 ( 1 ) " " "*" " " " " " "
2 ( 1 ) "*" "*" " " " " " "
3 ( 1 ) "*" "*" "*" " " " "
4 ( 1 ) "*" "*" "*" "*" " "
5 ( 1 ) "*" "*" "*" "*" "*"
Ejercicio de practica.
- Construya un modelo para predecir la circunferencia de cintura (abdomen) utilizando la base de datos bodyfat, primero forward, luego backward y finalmente stepwise. Compare sus resutlados
- Utilizando la base de datos